/*
  打 BOSS 4.0
  题目描述
    机器猫出门斗恶龙了！他需要通过 n 个关卡。
    每个关卡要么是与怪物战斗，扣除一定的血量；要么是营地，给机器猫增加一定的血量。
    在旅途中，机器猫任意时刻的血量不能低于或等于 0。

    问机器猫至少需要多少的初始血量，才能完成任务。
    初始血量为正整数。
  输入格式
    第一行，一个正整数 n，表示关卡数量。
    第二行，共 n 个整数 ai，表示每个关卡。
      若 ai > 0，则表示这个关卡是营地，增加 ai 的血量；
      若 ai < 0，则表示这个关卡是战斗，机器猫血量代价为 ai;
    其中，n ≤ 100000, 1 ≤ ∣ai∣ ≤ 1000。
  输出格式
    一个正整数，表示机器猫需要的初始血量。
  输入数据 1
    5
    -200 -300 1000 -100 -100
  输出数据 1
    501
  样例解释
    机器猫带着 501 点血量出门，两场战斗之后剩下 1，恢复到 1001，两场战斗之后为 801，完成任务。
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值: 1;
          区间的最大值: n 个关卡中造成的伤害之和 + 1;
      2) 判断某个答案是否满足题意的判定方法:
          遍历每个关卡，如果在某个关卡机器猫的血量小于等于 0，则该答案不满足题目要求；
          如果在所有的关卡，机器猫的血量都大于 0，则答案满足题目要求。
*/

long long n;
long long a[100010] = {}; // a[i] 表示发起第 i 个关卡机器猫的血量的变化值 (其中 i > 0)
long long s = 1, e = 1;   // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                          // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即机器猫的初始血量) 是否满足条件(题目要求)
bool cmp(long long x) {
    long long sum = x; // 机器猫的血量，初始时为 x

    for (int i = 1; i <= n; i++) {
        sum = sum + a[i]; // 如果在某个关卡机器猫的血量小于等于 0，则该答案不满足题目要求
        if (sum <= 0) {
            return false;
        }
    }

    return true;
}

int main() {
    cin >> n;
    bool flag = false;
    for (int o = 1; o <= n; o++) {
        cin >> a[o];
        if (a[o] < 0) { // 如果有关卡会造成伤害，那么答案的最大值为 "所有关卡造成的伤害之和 + 1"
            flag = true;
            long long x = abs(a[o]);
            e = e + x;  // 注意: 当前代码中，e 的初始值为 1。
        }
    }

    // 特殊情况: 如果所有的关卡中都不造成伤害，则直接输出 1 (初始血量只需要为 1 即可), 可以提升执行效率
    if (flag == false) {
        cout << 1;
        return 0;
    }

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最小值
      注意:
        特别技巧: 我们在编码时，要保证区间的最大值 e 一定大于等于 区间的最小值 s
                 这样就可以保证一定会进行一次循环处理!
    */
    long long num = 1;
    while (s <= e) {
        long long mid = (s + e) / 2;
        if (cmp(mid)) {
            num = mid;
            e = mid - 1; // 由于需要答案尽可能地小，所以我们进一步从 mid 的左半区间进行查找
        } else {
            s = mid + 1; // mid 不满足题目要求，从 mid 的右半区间进行查找
        }
    }
    cout << num;

    return 0;
}